package com.dcy.znoa.domain.attendance;

import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.dcy.znoa.common.enums.AddStatusCode;
import com.dcy.znoa.common.enums.ApplyAuditCode;
import com.dcy.znoa.common.enums.ApplyTypeCode;
import com.dcy.znoa.common.enums.TimeStatusCode;
import com.dcy.znoa.common.util.DateUtil;
import com.dcy.znoa.domain.sys.StoreFile;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@TableName("apply")//员工申请表 此表目前只包括外出申请：1 请假 2 出差 3 外勤
public class Apply {


    @TableId(type = IdType.AUTO, value = "apply_id")
    Long applyId;//申请ID

    @TableField("comp_id")
    Long compId;


    @TableField("e_name")
    String eName;//对应实体表名，目前只有考勤表,可以为空。申述时不能为空

    @TableField("e_id")
    Long eId;//对应实体表ID，可以为空；申述时不能为空

    @TableField("send_oper_id")
    Long sendOperId;//申请用户id

    @TableField("receive_oper_id")
    Long receiveOperId;//接收人ID

    @TableField("is_final")
    Integer isFinal;//是否最终审批人

    @TableField("apply_time")
    Date applyTime;//申请时间

    @TableField("start_time")
    Date startTime;

    @TableField("end_time")
    Date endTime;//结束时间，一般留空

    @TableField(exist = false)
    String diff;//时间差，小时为单位，暂时取整，暂时用 String

    @TableField("type")
    Integer type;//申请类型 1 请假 2 出差 3 外勤 9 申述
    /*
    * 申请子类型 :
        申请类型为
        1 请假 时，

        子类型为
        1 事假
        2 病假
        3 年休假
        4 丧假
        5 婚假
        6 调休
        7 产假
        8 陪产假
    * */
    @TableField("child_type")
    Integer childType;

    @TableField("title")
    String title;//申请标题

    @TableField("content")
    String content;//申请内容

    @TableField("remark")
    String remark;//申请备注

    @TableField("address")
    String address;//申请地点

    @TableField("audit_time")
    Date auditTime;//审核时间

    @TableField("is_audit")
    Integer isAudit;//审核状态：0：未审核 1  通过 2 未通过

    @TableField("audit_content")
    String auditContent;//审核内容

    @TableField("is_revoke")
    Integer isRevoke;//是否已撤销 ，0为否，1为是

    //以下是查询列表时的关联数据
    @TableField(exist = false)
    String compName;//公司名称

    @TableField(exist = false)
    String operName;//打卡用户名称

    @TableField(exist = false)
    String sendOperName;//新建消息的用户名称

    @TableField(exist = false)
    String phoneNo;//手机号码

    @TableField(exist = false)
    String receiveOperName;//审核人姓名

    @TableField(exist = false)
    String receiveHeadPic;//审核人头像

    @TableField(exist = false)
    String depName;//

    @TableField(exist = false)
    List<StoreFile> storeFileList;

    //    以下是att_real_record中的数据
    @TableField(exist = false)
    Integer recordType;//

    @TableField(exist = false)
    Date recordTime;//

    @TableField(exist = false)
    Integer timeStatus;//

    @TableField(exist = false)
    Integer addStatus;//

    @TableField(exist = false)
    Date attTime;//

    @TableField(exist = false)
    String attStatusStr;//值域：正常、迟到、早退、地点异常、未打卡。如果为空，说明是脏数据

    public static Map<String, Object> toMap(Apply apply) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("depName", apply.getDepName());
        map.put("operName", apply.getOperName());
        map.put("phoneNo", apply.getPhoneNo());
        map.put("type", ApplyTypeCode.getMsgByCode(apply.getType()));
        map.put("applyTime", DateUtil.getFormatDate(apply.getApplyTime()));
        map.put("address", apply.getAddress());
        map.put("startTime", DateUtil.getFormatDate(apply.getStartTime()));
        map.put("endTime", DateUtil.getFormatDate(apply.getEndTime()));
        map.put("diff", apply.getDiff());
        map.put("receiveOperName", apply.getReceiveOperName());
        map.put("isAudit", ApplyAuditCode.getMsgByCode(apply.getIsAudit()));
        map.put("auditTime", DateUtil.getFormatDate(apply.getAuditTime()));
        map.put("attStatusStr", apply.getAttStatusStr());
        if(apply.getRecordType()!=null){
            map.put("recordType", apply.getRecordType()==1?"上班":"下班");
        }
        map.put("recordTime", apply.getRecordTime());
        map.put("appTime", apply.getApplyTime());
        map.put("timeStatus", TimeStatusCode.getMsgByCode(apply.getTimeStatus()));
        map.put("addStatus", AddStatusCode.getMsgByCode(apply.getAddStatus()));


        return map;
    }

}
